#include <types.h>
#include <string.h>
#include <memory.h>

#define CHARACTER 1
#define OBJECT    2
#define OFFSET    3

extern "C" {
void _bset( LPVOID, BYTE, WORD );
}

class Object
{};

typedef Object * TObject;

class ArrayItem
{
   public:
   void * pPrev, * pNext;
   LPSTR szText;
   TObject pData;
   WORD wType;

   ArrayItem( void );
};

typedef ArrayItem * TArrayItem;

typedef BOOL ( * TCheckStr )( TObject, LPSTR );
typedef void ( * TVoidFunc )( TArrayItem );
typedef void ( * TEachObj )( TObject );

class Array : public ArrayItem
{
   TArrayItem pFirst, pLast;
   WORD wLen;

   public:
   Array( void );
   Array( WORD wLen );
   ~Array();

   TArrayItem Add( void ) { return Add( new ArrayItem() ); }
   TArrayItem Add( TArrayItem pArrayItem );

   TArrayItem Add( LPSTR szText )
   {
      TArrayItem it = Add();

      it->wType  = CHARACTER;
      it->szText = szText;

      return it;
   }

   TArrayItem Add( LONG offset )
   {
      TArrayItem it = Add();

      it->wType  = OFFSET;
      it->szText = ( LPSTR ) offset;

      return it;
   }

   TArrayItem Add( TObject obj )
   {
      TArrayItem it = Add();

      it->wType = OBJECT;
      it->pData = obj;

      return it;
   }

   WORD Len( void ) { return wLen; }
   TArrayItem First( void ) { return pFirst; }
   TArrayItem Last( void ) { return pLast; }

   void RemoveLast( void );
   void Clear( void );

   void Eval( TVoidFunc pFunc );
   void Eval( TEachObj pFunc );

   WORD Scan( TCheckStr pFunc, LPSTR );
   WORD Scan( LPSTR szText );

   TArrayItem operator[]( WORD wIndex );
};

typedef Array * TArray;

class Symbol : public Object
{
   public:
   BYTE   szName[ 11 ];
   BYTE   bScope;
   LPVOID pFunc;
   BOOL   bIsMsg;

   Symbol( LPSTR name, BYTE scope, BOOL IsMsg )
      { _bset( szName, 0, 11 ); strcpy( szName, name ); bScope = scope;
        pFunc = 0; bIsMsg = IsMsg; }
};

typedef Symbol * TSymbol;
